// Package mmd 这是MMD-YBK的zbp的插件编写教学示例
package mmd

import (
	"time"

	ctrl "github.com/FloatTech/zbpctrl"
	"github.com/FloatTech/zbputils/control"
	"github.com/FloatTech/zbputils/ctxext"
	zero "github.com/wdvxdr1123/ZeroBot"
	"github.com/wdvxdr1123/ZeroBot/message"
)

type user struct {
	Name string `flag:"n"`
	Age  int    `flag:"a"`
}

var (
	limit = ctxext.NewLimiterManager(time.Second*10, 1)
)

func init() {
	engine := control.Register("mmd", &ctrl.Options[*zero.Ctx]{
		DisableOnDefault: false,
		Help: "MMD-YBK\n模之屋\n下载MMD\n下载MMM\n下载PE\n下载水杉\n下载blender\n" +
			"MMD入门教程\nK帧教程\n绑骨教程\n水杉教程\nblender教程\nXISMO教程\nxismo文档\nPE插件编写教程\nPE插件文档\nMME编写教程\n" +
			"MAC\nMAC骨架\n贴吧\nB碗\nD站\nnico\nmisa\nvpvp\n" +
			"术语\n搜索资源\n新人引导\n" +
			"肩膀刷法\nPE快捷键\n导入AVI",
	})
	// hello
	engine.OnFullMatch("MMD-YBK").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("MMD-YBK网址 https://mmdybk.gitee.io/"))
	})
	engine.OnFullMatch("模之屋").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://www.aplaybox.com/"))
	})
	// 软件下载
	engine.OnFullMatch("下载MMD").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("MMD932汉化版 https://softbank.lanzoux.com/i30xakyunuh"))
	})
	engine.OnFullMatch("下载MMM").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("MikuMikuMoving64_v1292 https://ifwz.lanzouw.com/iwDEZ0awbr8j"))
	})
	engine.OnFullMatch("下载PE").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://softbank.lanzoux.com/iP3B6kyupaj"))
	})
	engine.OnFullMatch("下载水杉").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("Metasequoia4.8.3b汉化破解版 https://ifwz.lanzouw.com/i4sqt09xft0h"))
	})
	engine.OnFullMatch("下载blender").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("斑斓中国社区 https://www.blendercn.org/downloadme"))
	})
	// 软件教程
	engine.OnFullMatch("水杉教程").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("如诩姐的建模教程\nhttps://space.bilibili.com/326702/channel/seriesdetail?sid=916682 \n晓仙君的教程\nhttps://space.bilibili.com/30847042/channel/seriesdetail?sid=1313273 \n荞麦老师的教程（水杉3）\nhttps://www.bilibili.com/video/av8330062"))
	})
	engine.OnFullMatch("blender教程").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("只剩一瓶辣椒酱的教程 https://www.bilibili.com/video/BV1zh411Y7LX"))
	})
	engine.OnFullMatch("XISMO教程").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("mqdl大大亲授 https://space.bilibili.com/30847042/channel/seriesdetail?sid=1313270"))
	})
	engine.OnFullMatch("xismo文档").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://toolkit.gitee.io/xismo/#/"))
	})
	engine.OnFullMatch("PE插件文档").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://toolkit.gitee.io/peplugin_doc/#/"))
	})
	engine.OnFullMatch("PE插件编写教程").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://www.bilibili.com/video/BV1yi4y1s7gh/"))
	})
	engine.OnFullMatch("MME编写教程").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("视频教程 by KarlvonDonitz\n https://space.bilibili.com/27611393/channel/seriesdetail?sid=1246046 \n MME中文参考手册 by HTTです\n https://www.bilibili.com/read/cv6376737\n 舞力介入P配布特效一览 \n https://www.bilibili.com/read/cv15816388"))
	})
	engine.OnFullMatch("绑骨教程").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("MAC创作学园\n https://space.bilibili.com/18316420/channel/seriesdetail?sid=1275917 \n 所用骨架下载，发送 MAC骨架 \n emil的教程\n https://space.bilibili.com/113016 \nPmdEditor自学入门教程\nhttps://www.bilibili.com/video/av3246647/ \nMelt_浅蓝的教程 \n https://www.bilibili.com/video/av54741747/ \n "))
	})
	engine.OnFullMatch("K帧教程").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("曦歪（CY） https://space.bilibili.com/8070827/channel/seriesdetail?sid=1019126\nMAC创作学园 https://space.bilibili.com/18316420/channel/seriesdetail?sid=1275925"))
	})
	engine.OnFullMatch("MMD入门教程").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("MMD入门教程\n Kin妈的教程\n https://www.bilibili.com/video/av20662019/ \n RC的教程 \n https://www.bilibili.com/video/av12577403/\n Muchiiu大哥的教程 \nhttps://www.bilibili.com/video/av16525939/ \n KarlvonDonitz的教程\n https://www.bilibili.com/video/av42652879/ \n"))
	})
	//-------------
	engine.OnFullMatch("导入AVI").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://www.bilibili.com/read/cv14859861"))
	})

	engine.OnFullMatch("MMC").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("MikuMikuConvert（pmx/vrm与转fbx/pmx） https://mikumikuconvert.com/"))
	})

	engine.OnFullMatch("MAC").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("MAC创作学园 https://space.bilibili.com/18316420"))
	})

	engine.OnFullMatch("MAC骨架").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("MAC教学用骨架 https://ifwz.lanzouw.com/iyVgN0fwxz5g"))
	})
	engine.OnFullMatch("贴吧").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://tieba.baidu.com/f?kw=mikumikudance&ie=utf-8"))
	})
	engine.OnFullMatch("nico").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://www.nicovideo.jp/"))
	})
	engine.OnFullMatch("misa").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://3d-arts.misanyan.com/"))
	})
	engine.OnFullMatch("术语").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("场景 = ステージ =stage\n模型 = モデル =model\n动作 =モーション=motion\n镜头 = カメラ =camera\nMME=エフェクト=effect"))
	})
	engine.OnFullMatch("搜索资源").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://mmdybk.gitee.io/md/%E5%A6%82%E4%BD%95%E6%90%9C%E7%B4%A2%E8%B5%84%E6%BA%90%EF%BC%8C%E6%9F%A5%E7%9C%8B%E6%A8%A1%E5%9E%8B%E7%9A%84%E9%85%8D%E5%B8%83%E4%BD%BF%E7%94%A8%E8%A7%84%E5%88%99%EF%BC%8C%E7%BC%96%E5%86%99%E5%AE%8C%E6%95%B4%E7%9A%84%E5%80%9F%E7%89%A9%E8%A1%A8/"))
	})
	engine.OnFullMatch("新人引导").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://mmdybk.gitee.io/md/mmd%E6%96%B0%E6%89%8B%E5%BC%95%E5%AF%BC"))
	})
	engine.OnFullMatch("RC教程").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://www.bilibili.com/read/cv135853"))
	})

	engine.OnFullMatch("B碗").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://bowlroll.net/"))
	})
	engine.OnFullMatch("D站").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://www.deviantart.com/"))
	})
	engine.OnFullMatch("vpvp").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("https://w.atwiki.jp/vpvpwiki"))
	})

	// 教程截图
	engine.OnFullMatch("PE快捷键").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Image("https://s1.ax1x.com/2022/11/14/zAChjS.jpg"))
	})
	engine.OnFullMatch("肩膀刷法").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Image("https://s1.ax1x.com/2022/11/14/zk0V54.jpg"))
	})

	// matcher
	engine.OnFullMatch("完全匹配").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		matched := ctx.State["matched"].(string)
		ctx.SendChain(message.Text("完全匹配的匹配词: ", matched))
	})
	engine.OnFullMatchGroup([]string{"完全匹配组1", "完全匹配组2"}).SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		matched := ctx.State["matched"].(string)
		ctx.SendChain(message.Text("完全匹配组的匹配词: ", matched))
	})
	engine.OnKeyword("关键词").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		keyword := ctx.State["keyword"].(string)
		ctx.SendChain(message.Text("关键词匹配的关键词: ", keyword))
	})
	engine.OnCommand("命令").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		command := ctx.State["command"].(string)
		args := ctx.State["args"].(string)
		ctx.SendChain(message.Text("命令匹配的命令: ", command, "\n命令匹配的参数: ", args))
	})
	engine.OnPrefix("前缀").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		prefix := ctx.State["prefix"].(string)
		args := ctx.State["args"].(string)
		ctx.SendChain(message.Text("前缀匹配的前缀: ", prefix, "\n前缀匹配的参数: ", args))
	})
	engine.OnRegex(`(.*)正在(.*)`).SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		regexMatched := ctx.State["regex_matched"].([]string)
		ctx.SendChain(message.Text("正则匹配的匹配组: ", regexMatched))
	})
	engine.OnSuffix("后缀").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		suffix := ctx.State["suffix"].(string)
		args := ctx.State["args"].(string)
		ctx.SendChain(message.Text("后缀匹配的后缀: ", suffix, "\n后缀匹配的参数: ", args))
	})
	engine.OnShell("用户", user{}).SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		args := ctx.State["args"].([]string)
		u := ctx.State["flag"].(*user)
		ctx.SendChain(message.Text("shell匹配的结构体: ", u, "\nshell匹配的参数: ", args))
	})

	// message
	engine.OnFullMatch("文本").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("文本"))
	})
	engine.OnFullMatch("艾特").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.At(ctx.Event.UserID), message.Text("艾特你"))
	})

	engine.OnFullMatch("语音").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Record("https://vtbkeyboard.moe/api/audio/672328094/%E7%8C%AB%E7%8C%AB%E8%B7%9F%E9%BC%A0%E9%BC%A0%E4%B8%8D%E5%86%B2%E7%AA%81.mp3"))
	})

	engine.OnFullMatch("音乐").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Music("163", 28949129))
	})
	engine.OnFullMatch("tts").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.TTS("你好"))
	})
	engine.OnFullMatch("戳一戳").SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Poke(ctx.Event.UserID))
	})

	// rule
	engine.OnFullMatch("牛逼", zero.AdminPermission).SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("你很牛逼"))
	})
	engine.OnFullMatch("消息检测", checkRule).SetBlock(true).Limit(limit.LimitByGroup).Handle(func(ctx *zero.Ctx) {
		ctx.SendChain(message.Text("检测完毕"))
	})
}

func checkRule(ctx *zero.Ctx) bool {
	if zero.OnlyPrivate(ctx) {
		ctx.SendChain(message.Text("这是私聊信息"))
	}
	if zero.OnlyGroup(ctx) {
		ctx.SendChain(message.Text("这是群聊信息"))
	}
	if zero.OnlyToMe(ctx) {
		ctx.SendChain(message.Text("这是@bot的信息"))
	}
	if zero.OnlyGuild(ctx) {
		ctx.SendChain(message.Text("这是频道信息"))
	}
	if zero.OnlyPublic(ctx) {
		ctx.SendChain(message.Text("这是群聊或者频道信息"))
	}
	if zero.AdminPermission(ctx) {
		ctx.SendChain(message.Text("你有管理员权限"))
	}
	if zero.OwnerPermission(ctx) {
		ctx.SendChain(message.Text("你有群主权限"))
	}
	if zero.SuperUserPermission(ctx) {
		ctx.SendChain(message.Text("你有主人权限"))
	}
	return true
}
